import numpy as np
def numerical_gradient(f,x):
    h=1e-4
    grad=np.zeros_like(x) #生成一个型状和x相同，所有元素都是0的数组
    for idx in range(x.size):
        tmp_val=x[idx]
        #f(x+h)
        x[idx]=tmp_val+h
        fxh1=f(x) #这里的x是一个数组x=[x[0]+h,x[1]]
        #f(x-h)
        x[idx]=tmp_val-h
        fxh2=f(x)   #x=[x[0]-h,x[1]]

        grad[idx]=(fxh1-fxh2)/(2*h)
        x[idx]=tmp_val  #把x的值给还原了,因为此时的x[0]=x[0]-h
    return grad   
def gradient_descent(f,init_x,lr=0.01,step_num=100):
    x=init_x
    for i in range(step_num):
        grad=numerical_gradient(f,x) #grad和x都是数组
        x-=lr*grad
    return x    
#求f(x0+x1)=x0^2+x1^2
def function_2(x):
    return x[0]**2+x[1]**2
init_x=np.array([-3.0,4.0])
y=gradient_descent(function_2,init_x=init_x,lr=0.1,step_num=100)
print(y)